查看原文
其他

Stata:dofile文件规整神器-lint

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会课程 · 2023 五一论文班

作者:郭盼亭 (厦门大学)
邮箱:gpting2020@163.com

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 引言

  • 2. 命令介绍

  • 3. 基本用法介绍

    • 3.1 检测

    • 3.2 更正

    • 3.3 其他选项

    • 3.4 要检测的编码实践

    • 3.5 需要纠正的编码实践

  • 4. 相关推文



1. 引言

不知道你在刚开始写代码的时候,是否遇见过以下情况:不确定自己写的对不对?又或者运行的时候总是报错?又或者是写出来的格式总是没有别人写的好看?是否希望有一款自动纠错的工具?

stata_linter 或许可以帮助你!该软件包是一种主观的检测工具,该命令是根据世界银行开发影响评估部门的良好编码实践编写的,旨在改善 Stata 的 do 文件的可读性和组织性。

在 Stata 中可以通过 lint 命令来实现两个功能:

  • 检测功能 (Detection) 可以识别 Stata 的 do-files 中的写的不良编码。
  • 纠正功能 (Correction) 用于纠正 Stata 的 do-file 中的错误编码。

2. 命令介绍

命令安装:

ssc install stata_linter, replace

需要注意的是,要运行此命令,使用者需要安装 Stata16 版本或更高版本、Python 和 Python 的 Pandas 包。

命令语法:

lint "input_file" [using "output_file"] , [options]
  • 如果使用 using 指定了 output_file,那么 linter 将应用纠正功能 (Correction),将更正后的代码写入指定的 output_file
  • 如果没有指定 output_file,该命令将只执行检测功能 (Detection),在 Stata 的 Results 窗口中返回更正的建议和 do 文件的潜在问题的报告。
  • 另外需要注意的是,并不是所有在 Detection 中发现的不良代码都可以通过纠正功能 (Correction) 进行修正。

其中,options 如下:

  • verbose:报告每行 do-file 中发现的不良实践和问题。
  • nosummary:禁止生成不良实践和潜在问题的总结表。
  • indent(integer):检查缩进编码实践时使用的空格数 (默认值为 4)。
  • space(integer):检查缩进实践时使用的空格数而非硬制表符 (默认值:与缩进值相同)。
  • linemax(integer):检查行扩展实践时一行中的最大字符数 (默认值为 80)。
  • excel(filename):将逐行结果保存为 Excel 文件。
  • force:允许输出文件名与输入文件名相同,覆盖原始 do-file。不建议使用此选项,因为命令创建的纠正后的 do-file 可能会破坏代码的某些部分,使用者应该始终保留其原始代码备份。
  • automatic:自动纠正所有不良编码实践,无需询问是否要纠正每个不良编码实践。默认情况下,命令会在生成总结报告后交互式地询问用户每个纠正。
  • replace :覆盖任何现有的输出文件。

3. 基本用法介绍

3.1 检测

. lint "test/bad.do"
* 在您的 Stata 控制台上,您将获得代码中发现的不良编码实践的摘要:
---------------------------------------------------------
Bad practice Occurrences
---------------------------------------------------------
Hard tabs used instead of soft tabs: Yes
One-letter local name in for-loop: 3
Non-standard indentation in { } code block: 7
No indentation on line following ///: 1
Missing whitespaces around operators: 0
Implicit logic in if-condition: 1
Delimiter changed: 1
Working directory changed: 0
Lines too long: 5
Global macro reference without { }: 0
Use of . where missing() is appropriate: 6
Backslash detected in potential file path: 0
Tilde (~) used instead of bang (!) in expression: 5
--------------------------------------------------------

如果要获取出现这些不良编码实践的行,可以使用选项,例如 verbose

. lint "test/bad.do", verbose

在命令的常规输出之前提供以下信息:

(line 14): Use 4 white spaces instead of tabs. (This may apply to other lines as well.)
(line 15): Avoid to use "delimit". For line breaks, use "///" instead.
(line 17): This line is too long (82 characters). Use "///" for line breaks so that one line has at m
> ost 80 characters.
(line 25): After declaring for loop statement or if-else statement, add indentation (4 whitespaces).
(line 25): Always explicitly specify the condition in the if statement. (For example, declare "if var
> == 1" instead of "if var".)
...

3.2 更正

如果要更正 do-file 中的不良做法,可以运行以下命令:

. lint "test/bad.do" using "test/bad_corrected.do"

在这种情况下,lint 命令将创建一个名为 的 do 文件。Stata 会询问您是否要对检测到的每个不良做法逐个执行一组更正。您可以添加自动执行更正的选项,并跳过手动确认。强烈建议输出文件与输入文件具有不同的名称,因为原始 do 文件应保留为备份。

作为此命令的结果,一段 Stata 代码如下所示:

#delimit ;
foreach something in something something something something something something
something something{ ; // some comment
do something ;
} ;
#delimit cr

成为:

foreach something in something something something something something something ///
something something { // some comment
do something
}

if something ~= 1 & something != . {
do something
if another == 1 {
do that
}
}

成为

if something ~= 1 & something != . {
do something
if another == 1 {
do that
}
}

3.3 其他选项

检测功能相关的选项:

  • verbose:显示出现不良做法的所有行。
  • nosummary:禁止显示不良做法的摘要。
  • excel():将检测结果导出到 Excel。

校正功能独有的选项:

  • automatic:更正所有不良编码实践,而不询问是否希望纠正检测到的每个不良编码实践。
  • replace:替换现有输出文件。
  • force:允许输出文件名与输入文件名相同 (不推荐)。

这两个功能的选项:

  • indent():指定用于缩进的空格数 (默认值为 4)。
  • linemax():一行中的最大字符数 (默认值为 80)。
  • tab_space():使用的空格数而不是硬制表符 (默认值为 4)。

3.4 要检测的编码实践

使用软制表符 (即空格),而不是硬制表符:使用空格 (通常使用 2 或 4 个空格) 而不是硬制表符。您可以在 do-file 编辑器首选项中更改此选项。

避免使用抽象索引名称:在 for 循环中,索引名称应描述代码循环的内容。因此,避免像这样编码:

foreach i of var cassava maize wheat { }

相反,循环命令应以描述性方式在本地命名索引:

foreach crop of var cassava maize wheat { }

使用正确的缩进:声明 for 循环语句或 if-else 语句后,添加带有空格 (通常为 2 或 4 个空格) 的缩进。

声明换行符后使用缩进 ///:在新行语句后,添加缩进 (通常为 2 或 4 个空格)。

使用 !missing() 函数表示缺失值:为清楚起见,请使用 !missing(var) 表示缺失值,而不是 var < . var != .

在数学符号 (+=<>) 周围添加空格:为了提高可读性,请在数学符号周围添加空格。例如,用 gen a = b + c if d == e 代替 gen a=b+c if d==e

if 语句中指定条件:始终在 if 语句中显式指定条件。例如,声明 if var == 1 而不是 if var

不要使用 delimit 作为分隔符,而应使用 /// 作为换行符:有关使用换行符的详细信息,请参阅此处

不要使用 cd 命令更改当前文件夹:使用绝对和动态文件路径。

对过长的行使用换行符 ///:对于太长的行,请使用换行符并将它们分成多行。建议将一行中的字符数限制在 80 以内。虽然有时这很困难,因为例如,Stata 不允许双引号内的分隔符,请尽可能遵循此规则。

对全局宏使用大括号:始终用于全局宏。例如,使用 ${ } ${global} 代替 $global

在条件表达式中包含缺失值:条件表达式可能对于缺失值被计算为 true。确保通过在表达式中使用来显式考虑缺失值。var != 0 var > 0 missing()

检查文件路径中是否未使用反斜杠:检查文件路径中是否使用反斜杠(\)。如果您正在使用它们,请将它们替换为正斜杠(/)

检查波浪号 (~) 是否不用于否定:如果使用波浪号进行否定,请将其替换为 (!) 符号。

3.5 需要纠正的编码实践

该功能不会更正检测到的所有不良做法。 它仅更正以下内容:

  • 将需要换行的地方使用 delimit 替换为///
  • 将硬制表符替换为软空格 (默认为 4)。可以使用选项设置空间量 tab_space()
  • 默认情况下,缩进大括号内的行有 4 个空格。可以使用选项设置空间量 indent()
  • 将长行分成两行。默认情况下,长行被视为超过 80 个字符,但可以使用该选项linemax()
  • 在打开大括号之前添加空格,全局变量除外。
  • 在右大括号后删除多余的空白行。
  • 删除重复的空白行。

如果省略该选项,将提示用户确认他们是否要在检测到这些不良做法时才更正这些不良做法。如果未检测到这些,它将显示以下消息:

Nothing to correct.
The issues lint is able to correct are not present in your dofile.
No output files were generated.

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 代码 规范, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:论文写作
    • Stata:论文重现代码模板
  • 专题:Stata教程
    • Stata:聚类标准误代码介绍
  • 专题:回归分析
    • Stata:一行代码实现安慰剂检验-permute
  • 专题:倍分法DID
    • Stata:一行代码绘制平行趋势图-eventdd
  • 专题:工具软件
    • 语法高亮:LaTeX中的彩色Stata代码
  • 专题:其它
    • 知乎热议:你见过最烂的代码长什么样子?
  • 专题:论文重现
    • 如何整理一份规范的论文复现文档?
  • 专题:公开课
    • ⏩连享会公开课:论文复现的数据和代码-连玉君

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存